【问题标题】:Insert foreign key in db hibernate在db hibernate中插入外键
【发布时间】:2014-05-01 15:38:57
【问题描述】:

我有一个包含五条数据的节点数据库:

  • id (int, PK)
  • 问题(varchar)
  • 结果(varchar)
  • left_id (int, FK)
  • right_id (int FK)

和同一张表中的两个外键:

  • left_id -> id
  • right_id -> id

这是我的豆子:

@Entity
@Table (name = "node")
public class Nodes
{
    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column(name="id")
    @NotNull
    private int id;

    @Column (name = "question")
    private String question;

    @Column ( name = "result")
    private String result;

    @OneToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="left_id", referencedColumnName="id")
    private Nodes left;

    @OneToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="right_id", referencedColumnName="id")
    private Nodes right;

我可以通过以下方式查看 left_id:

nodes.getLeftNodes().getId_node();

但我无法在我的数据库中插入新数据 left/right_id

我的插入方法是

public void insert_question(String question, int left_id) throws HibernateException
    {
        try
        {
            Session session = getSession();
            Transaction tx = session.beginTransaction();

            Nodes node = new Nodes();

            node.setQuestion(question);
            node.setId_node(left_id);

            session.saveOrUpdate(node);
            tx.commit();
            session.close();
        }

问题已插入数据库,但未插入 left_id。对我来说,问题是外键(左或右节点)是一个对象,但在我的数据库中 left_id 是一个整数!

由于有外键,我如何在没有 left/right_id 整数的情况下在 db 中插入 left/right_id ?

非常感谢

【问题讨论】:

    标签: java mysql database hibernate foreign-keys


    【解决方案1】:

    如果我理解正确,您想创建一个新节点,其中包含对现有左节点的引用。而left_id(我将重命名为leftId 以符合标准命名约定)是现有左节点的标识符。

    所以这很简单:您首先需要获取对数据库中现有节点左节点的引用,然后创建引用此左节点的新节点,然后插入新节点:

    Node leftNode = (Node) session.load(Node.class, leftId);
    
    Node node = new Node();
    node.setQuestion(question);
    node.setLeft(leftNode);
    
    session.save(node);
    

    请注意,我还将Nodes 重命名为Node。此类的一个实例代表一个节点,因此没有理由将此类命名为Nodes。

    【讨论】:

    • 感谢您的回答。我尝试了您的解决方案,但出现此错误“java.lang.NoSuchMethodError: net.sf.cglib.proxy.MethodProxy.create(Ljava/lang/ClassLoader;Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/ String;Ljava/lang/String;Ljava/lang/String;)Lnet/sf/cglib/proxy/MethodProxy;"
    猜你喜欢
    • 2013-03-03
    • 2011-03-19
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多