Java Hibernate继承表相互引用

Java Hibernate继承表相互引用,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我使用的是hibernate,在我的数据模型中,我使用的是hibernate.Inheritance在两个不同的位置使用一个表,但当它们相互作用时会出现问题。让我试着用这个例子来简化 基本上,当我写字母时会发生什么。设置单词(word),然后保存它。单词没有对字母的引用。根据我对mappedBy的理解,您不必在两端显式地设置和保存它,是吗?当我在数据库中查看时,字段被正确地设置为它所引用的单词的guid。我做错什么了吗 旁注:我之所以在getter上添加注释,是因为如果将注释直接放在全局变量上,

我使用的是hibernate,在我的数据模型中,我使用的是hibernate.Inheritance在两个不同的位置使用一个表,但当它们相互作用时会出现问题。让我试着用这个例子来简化

基本上,当我写字母时会发生什么。设置单词(word),然后保存它。单词没有对字母的引用。根据我对mappedBy的理解,您不必在两端显式地设置和保存它,是吗?当我在数据库中查看时,字段被正确地设置为它所引用的单词的guid。我做错什么了吗

旁注:我之所以在getter上添加注释,是因为如果将注释直接放在全局变量上,hibernate根本不会提取它们。(我没有在从字母扩展的类上设置主键错误)。hibernate不处理相互引用的多个继承表吗?当我只有一个继承表时,所有内容都可以直接在全局变量上使用注释

谢谢, 迈克


@实体
@表(name=“Word”)
@继承(策略=InheritanceType.SINGLE_表)
@鉴别器柱(
name=“WORD\u TYPE”,
discriminatorType=discriminatorType.STRING)
公共抽象类词{
私有字符串值;
私人名单信件;
私有字符串id;
@身份证
@GeneratedValue(generator=“uuid”)
@GenericGenerator(name=“uuid”,strategy=“org.hibernate.id.UUIDHexGenerator”)
@访问权限(AccessType.PROPERTY)
公共字符串getId(){
返回id;
}
@列(name=“VALUE”)
@访问权限(AccessType.PROPERTY)
公共字符串getValue(){
返回值;
}
@OneToMany(mappedBy=“word”)
@级联({CascadeType.ALL})
@访问权限(AccessType.PROPERTY)
公共列表getLetters(){
回信;
}
***************无注释的基本设置器**********
}

您的理解是错误的,您有责任维护所修改实体的正确内存状态。Hibernate不会自动将新对象添加到另一端的内存实体中。

在查看
word.getLetters()
是否包含字母之前,您是否使用了此选项?我将此标记为正确,但实际上我是在转移注意力。我认为它没有被正确设置,但实际上我的问题存在于我的延迟加载中。(由于某种原因,在尝试访问“字母”时,我得到的是NullPointerException而不是LazyLoadException。无论如何,你的回答帮助我从最初的想法开始,重新思考,以找到实际问题。谢谢!
@Entity
@Table(name="Letter")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "LETTER_TYPE",  
    discriminatorType=DiscriminatorType.STRING)
public abstract class Letter {

   private String id;

   private String value;

   private Word word;

   @Id
   @GeneratedValue(generator = "uuid")
   @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDHexGenerator")
   @Access(AccessType.PROPERTY)
   public String getId() {
       return id;
   }

   @Column(name = "VALUE")
   @Access(AccessType.PROPERTY)
   public String getValue() {
         return value;
   }

   @ManyToOne
   @JoinColumn(name = "WORD_ID")
   @Access(AccessType.PROPERTY)
   public Word getWord() {
        return word;
   }

          ********BASIC SETTERS WITH NO ANNOTATIONS********
}
 @Entity
@Table(name="Word")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "WORD_TYPE",  
    discriminatorType=DiscriminatorType.STRING)
public abstract class Word {

   private String value;

   private List<Letter> letters;

   private String id;

   @Id
   @GeneratedValue(generator = "uuid")
   @GenericGenerator(name = "uuid", strategy = "org.hibernate.id.UUIDHexGenerator")
   @Access(AccessType.PROPERTY)
   public String getId() {
       return id;
   }

   @Column(name = "VALUE")
   @Access(AccessType.PROPERTY)
   public String getValue() {
         return value;
   }

  @OneToMany(mappedBy="word")
  @Cascade({CascadeType.ALL})
  @Access(AccessType.PROPERTY)
   public List<Letter> getLetters() {
        return letters;
   }

        ***************BASIC SETTERS WITH NO ANNOTATIONS**********
}