2017-06-23 70 views
1

我有一个类可以引用多个类中的一个。Java - Hibernate一个类可以引用多个类中的一个

老类的结构如下:

public class CarOne { 
    private int id; 
    private int type; //one 
    ... 
} 

public class CarTwo { 
    private int id; 
    private int type; //two 
    ... 
} 

public class CarThree { 
    private int id; 
    private int type; //three 
    ... 
} 

他们不是SupperMapped,他们都在自己的表中存在用自己的ID。我没有什么可以改变的,因为它已经在这样的生产中已经有一段时间了。

现在我需要添加一个新的类:

我能想到自己的
public class Numberplate { 
    //here I'd like a one to one mapping to one of the classes? 
} 

一种选择是,我可以添加上车对象的OneToOne关系,但我希望有使用选项'id'和'type'作为鉴别器,将关系放在Numberplate方面。有这种可能吗?

(免责声明:例子是纯属虚构,但情况不算)

回答

1

您可以使用连接继承型,创造了超汽车,然后蒈,CarTwo,CarThree必须扩展它。你可以找到一个完整的例子加入here

+0

他说:“他们不是超图,他们都存在于自己的桌子上,并拥有自己的ID。我没有什么可以改变这一点的,因为它已经在这样的生产中有一段时间了。“ –

+0

ops你是rigth,我只读他们没有超映射 –

1

为什么你不使用TABLE_PER_CLASS策略?这种策略只有具体的类在数据库中有相应的表,超类仅用于共享和分组的目的。

例如,您为所有CarClass(CarOne,CarTwo ...)定义了一个抽象类,它具有一个复合主键,它是id和type。

@Embeddable 
public class CarKey implements Serializable{ 
public Long id; 
public String type; 
} 

在这里您将所有的汽车类

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class SuperCar{ 
@EmbeddedId 
public CarKey id; 

// Getter & Setter 
} 

这里代码的抽象类,父为每个子类

@Entity 
public class CarOne extends SuperCar{ 

// specific attribute 
} 

下面的代码为您的铭牌类

@Entity 
public class Numberplate { 

@OneToOne 
@JoinColumns({ 
@JoinColumn(name="car_id",referencedColumnName = "id"), 
@JoinColumn(name="car_type",referencedColumnName = "type") 
}) 
public SuperCar car; 
} 

刚照顾性能特别是如果你有很多的子类,这个策略就成了问题。

相关问题