java - hibernate 和 JPA : how to make a foreign key constraint on a String

标签 java hibernate jpa

我正在使用 Hibernate 和 JPA。如果我有两个简单的实体:

@Entity
@Table(name = "container")
public class Container {
  @Id
  @Column(name="guid")
  private String guid;
}

@Entity
@Table(name="item")
public class Item {
  @Id
  @Column(name="guid")
  private String guid;

  @Column(name="container_guid")
  private String containerGuid;
}

并且我想确保如果引用的容器不存在,则插入项目会失败。我不希望在项目对象 (ManyToOne) 中填充 Container 对象,如果可以的话我该怎么做?

最佳答案

您可以使用columnDefinition属性声明任意约束:

@Column(name="container_guid", 
     columnDefinition = "VARCHAR(255) REFERENCES container(guid)")
private String containerGuid;

但是请注意,Hibernate 对这个约束一无所知,因此,例如,它可能无法按照正确的顺序执行插入等等。

因此,最好创建 @ManyToOne 关系。如果您担心设置此属性需要对 Container 进行额外的 SQL 查询,可以使用 Session.load()/EntityManager.getReference() 获取代理而不发出实际查询。

关于java - hibernate 和 JPA : how to make a foreign key constraint on a String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062194/

相关文章:

java - 如何使用 JPA 处理多个父类型?

java - 我在哪里可以找到 Hibernate-JPA jar 的 javadoc

java - 处理:当从 Eclipse 设置内部调用时,createShape 返回 null

java.lang.ClassNotFoundException : javax. el.StaticFieldELResolver 异常

java - Spring 3.2 - 将@EnableAsync 添加到@Configuration 类时项目加载失败

java.sql.SQLNonTransientConnectionException : org. apache.thrift.transport.TTransportException : Frame size larger than max length (16384000)!

java - 如何通过 Hibernate 在 PostgreSQL 中保存数据期间修复 "ERROR: Invalid endian flag value encountered."

java - 运行 hibernate 应用程序时出现异常

oracle - 如何在我的域类中存储一个巨大的字符串?

mysql - JPA Eclipselink错误: "Field ' Target_id' doesn't have a default value"