Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate,间接关系映射_Java_Hibernate_Orm_Relational Database - Fatal编程技术网

Java Hibernate,间接关系映射

Java Hibernate,间接关系映射,java,hibernate,orm,relational-database,Java,Hibernate,Orm,Relational Database,我有两张桌子:单词和词干。第二个字段是单词的外键。这么多的词干可以属于一个词 在Java中,我创建了实体Word和Stem。因为word可以有许多词干,并且我对这些词干的列表进行了一些操作,所以我决定将这个列表和对应的方法放在单独的名为stemes的类中。此类的对象位于Word实体中。下面我将介绍我的代码的外观: Word.java @Entity @Table(name = "Word") @Inheritance(strategy=InheritanceType.JOINED) pub

我有两张桌子:单词和词干。第二个字段是单词的外键。这么多的词干可以属于一个词

在Java中,我创建了实体Word和Stem。因为word可以有许多词干,并且我对这些词干的列表进行了一些操作,所以我决定将这个列表和对应的方法放在单独的名为stemes的类中。此类的对象位于Word实体中。下面我将介绍我的代码的外观:


Word.java

@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Transient
    protected Stems stems = new Stems();

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word")
    public List<Stem> getStems() {
        return stems.getStems();
    }
}
public class Stems {

    private List<Stem> stems = new ArrayList<>();

    public List<Stem> getStems() {
        return stems;
    }

    public void setStems(List<Stem> stems) {
        this.stems = stems;
    }
}
@Entity  
@Table(name = "Stems")  
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
@DiscriminatorColumn(name="Type",discriminatorType=DiscriminatorType.STRING)  
public abstract class Stem implements Cloneable{

    @Id
    @Column(name = "Stem", unique = true, nullable = false, length = 64)
    private String rawStem;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "WordId", nullable = false)
    private Word word;
}
@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Embedded
    protected Stems stems = new Stems();

    public List<Stem> getStems() {
        return stems.getStems();
    }

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }
}
@Embeddable
public class Stems {
    // orphanRemoval removes stems which is present in database but not on list
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word", orphanRemoval = true)
    private List<Stem> stems = new ArrayList<>();

    // getters/setters
}


我的问题来了。是否可以进行HQL查询以获得具有正确词干的单词?如果没有,那么如何实现这一点。也许这个结构不允许工作?如何添加/更新带有词干的单词?我尝试在word中设置词干数组,并在每个词干中设置单词id,然后使用session.merge(word),但它不起作用

我看到了光明。我想在这里粘贴我问题的完整解决方案。此解决方案仅允许在包含词干列表的word对象上调用session.merge来修改词干表

请注意@OneToMany注释中的注释@Embedded@Embedded和参数删除


Word.java

@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Transient
    protected Stems stems = new Stems();

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word")
    public List<Stem> getStems() {
        return stems.getStems();
    }
}
public class Stems {

    private List<Stem> stems = new ArrayList<>();

    public List<Stem> getStems() {
        return stems;
    }

    public void setStems(List<Stem> stems) {
        this.stems = stems;
    }
}
@Entity  
@Table(name = "Stems")  
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
@DiscriminatorColumn(name="Type",discriminatorType=DiscriminatorType.STRING)  
public abstract class Stem implements Cloneable{

    @Id
    @Column(name = "Stem", unique = true, nullable = false, length = 64)
    private String rawStem;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "WordId", nullable = false)
    private Word word;
}
@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Embedded
    protected Stems stems = new Stems();

    public List<Stem> getStems() {
        return stems.getStems();
    }

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }
}
@Embeddable
public class Stems {
    // orphanRemoval removes stems which is present in database but not on list
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word", orphanRemoval = true)
    private List<Stem> stems = new ArrayList<>();

    // getters/setters
}
@实体
@表(name=“Word”)
@继承(策略=InheritanceType.JOINED)
公共抽象类Word实现了可序列化{
//主键和其他列
@嵌入
受保护的杆=新杆();
公共列表getStems(){
返回stems.getStems();
}
公共无效设置项(列表项){
本.杆.设置杆(杆);
}
}
stemes.java

@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Transient
    protected Stems stems = new Stems();

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word")
    public List<Stem> getStems() {
        return stems.getStems();
    }
}
public class Stems {

    private List<Stem> stems = new ArrayList<>();

    public List<Stem> getStems() {
        return stems;
    }

    public void setStems(List<Stem> stems) {
        this.stems = stems;
    }
}
@Entity  
@Table(name = "Stems")  
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
@DiscriminatorColumn(name="Type",discriminatorType=DiscriminatorType.STRING)  
public abstract class Stem implements Cloneable{

    @Id
    @Column(name = "Stem", unique = true, nullable = false, length = 64)
    private String rawStem;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "WordId", nullable = false)
    private Word word;
}
@Entity
@Table(name = "Word")
@Inheritance(strategy=InheritanceType.JOINED)  
public abstract class Word implements Serializable{

    // primary key and other columns

    @Embedded
    protected Stems stems = new Stems();

    public List<Stem> getStems() {
        return stems.getStems();
    }

    public void setStems(List<Stem> stems) {
        this.stems.setStems(stems);
    }
}
@Embeddable
public class Stems {
    // orphanRemoval removes stems which is present in database but not on list
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word", orphanRemoval = true)
    private List<Stem> stems = new ArrayList<>();

    // getters/setters
}
@可嵌入
公共类词干{
//孤立删除将删除数据库中存在但不在列表中的茎
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“word”,orphan=true)
private List stees=new ArrayList();
//能手/二传手
}
Stem.java-无更改