Java和Hibernate-如何使OneToOne与SuperAppedClass而不是实体建立关系
我有三个实体:Java和Hibernate-如何使OneToOne与SuperAppedClass而不是实体建立关系,java,hibernate,Java,Hibernate,我有三个实体:Client、ClientConfigurationA和ClientConfigurationB 我试着做一些类似于: @Entity @Table(name = "CLIENT") public class Client { @Id private int id; @OneToOne(mappedBy = "client") private ClientConfiguration configuration // some gette
Client
、ClientConfigurationA
和ClientConfigurationB
我试着做一些类似于:
@Entity
@Table(name = "CLIENT")
public class Client {
@Id
private int id;
@OneToOne(mappedBy = "client")
private ClientConfiguration configuration
// some getter and setter
}
@MappedSuperClass
public class ClientConfiguration {
@Id
private int id;
@OneToOne
@MapsId
protected Client client;
// getters and setters
}
@Entity(name = "CLIENT_CONF_A")
public class ClientConfigurationA extends ClientConfiguration { ... }
@Entity(name = "CLIENT_CONF_B")
public class ClientConfigurationB extends ClientConfiguration { ... }
但实际上我不能定义一个与MappedSuperClass
相关的OneToOne,也不能定义一个实体
那么,实施该案例的最佳方式是什么
我已经试过了,但没有成功
感谢阅读。这是不可能的,原因如下: 当hibernate处理实体时,它需要知道在解析一对一关系时要连接哪个表
@MappedSuperClass
的问题在于它没有定义表,因此可以从这个类继承多个实体,每个实体都有不同的表。Hibernate当时不知道要加入哪个表
如果您想拥有通用的超类,我建议使用抽象的
@Entity
类。这是不可能的,原因如下:
当hibernate处理实体时,它需要知道在解析一对一关系时要连接哪个表
@MappedSuperClass
的问题在于它没有定义表,因此可以从这个类继承多个实体,每个实体都有不同的表。Hibernate当时不知道要加入哪个表
如果你想拥有一个通用的超类,我建议使用一个抽象的
@Entity
类。经过多次尝试,我终于成功了
@Entity
@Table(name = "CLIENT")
public class Client {
@Id
private int id;
@OneToOne(mappedBy = "client")
private ClientConfiguration configuration
// some getter and setter
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "TYPE")
public abstract class ClientConfiguration {
@Id
private int id;
@Column(name = "TYPE")
private String type;
@OneToOne
@MapsId
protected Client client;
// getters and setters
}
@Entity(name = "CLIENT_CONF_A")
public class ClientConfigurationA extends ClientConfiguration { ... }
@Entity(name = "CLIENT_CONF_B")
public class ClientConfigurationB extends ClientConfiguration { ... }
经过多次尝试,我终于成功了
@Entity
@Table(name = "CLIENT")
public class Client {
@Id
private int id;
@OneToOne(mappedBy = "client")
private ClientConfiguration configuration
// some getter and setter
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name = "TYPE")
public abstract class ClientConfiguration {
@Id
private int id;
@Column(name = "TYPE")
private String type;
@OneToOne
@MapsId
protected Client client;
// getters and setters
}
@Entity(name = "CLIENT_CONF_A")
public class ClientConfigurationA extends ClientConfiguration { ... }
@Entity(name = "CLIENT_CONF_B")
public class ClientConfigurationB extends ClientConfiguration { ... }
你是说
扩展客户端配置
和私有客户端配置
?如果没有,你想做什么就不清楚了这就是我的意思。很抱歉。此解决方案的可能副本无效。如果我保留SINGLE_表
继承策略,它根本不起作用,Hibernate就找不到CLIENT_CONF_A
或CLIENT_CONF_B
表。如果我将其设置为TABLE\u PER_CLASS
,他会找到表,但是Client
中的configuration
为空,而ClientConfiguration
中的Client
也为空。你的意思是扩展ClientConfiguration
和私有ClientConfiguration
?如果没有,你想做什么就不清楚了这就是我的意思。很抱歉。此解决方案的可能副本无效。如果我保留SINGLE_表
继承策略,它根本不起作用,Hibernate就找不到CLIENT_CONF_A
或CLIENT_CONF_B
表。如果我将其设置为TABLE\u PER_CLASS
,他会找到表,但是configuration
fromClient
为空,而Client
fromClientConfiguration
也为空。好的,配置之间唯一的共同点是客户端的外键。所以,如果我不能在这里定义我的连接,我将不得不找到另一个解决方案。好的,事实上,配置之间唯一的共同点是客户端的外键。所以如果我不能在这里定义我的连接,我将不得不找到另一个解决方案。