gpt4 book ai didi

java - 在 hibernate 中仅将属性设置为外键 int 就足够了吗?

转载 作者:行者123 更新时间:2023-11-29 19:41:19 24 4
gpt4 key购买 nike

我想在hibernate java类中的Mysql表之间建立外键一对一关系。

数据库:

表1:

Id   int         PK
name varchar(10) NN

表2:

Id      int         PK
name varchar(10) NN
tabe1Id int FK

代码:

JavaClass1

@Entity
@Table(name="table1")
public class table1{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Id")
private int Id;

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

JavaClass2

@Entity
@Table(name="table2")
public class table2{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Id")
private int Id;

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

@Id
@Column(name="table1Id")
private int JavaClass1Id;
}

这样写就够了吗?将 JavaClass1Id 作为整数存储在 JavaClass2 中,而不在 hibernate 中与另一个类建立关系?

最佳答案

正如人们已经指出的那样,您正在寻找 @OneToOne 和 JPA 指南。这是对此的基本方法:

类表1:

@Entity
@Table(name="table1")
public class table1{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="Id")
private int Id;

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

// omitting constructors, getters, setters, toString, etc.
}

类表2:

@Entity
@Table(name="table2")
public class table2{

@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="Id")
private int Id;

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

@OneToOne // using default values for db schema
private table1 t1; // notice how you have an actual reference to your object

// omitting constructors, getters, setters, toString, etc.
}

演示:

public void demo() {
table1 t1 = new table1("my table1 object");
t1 = t1Repo.save(t1);

table2 t2 = new table2("my table2 object", t1);
t2 = t2Repo.save(t2);

for (table2 t : t2Repo.findAll()) {
log.info("retrieved t2 object " + t);
}
}

打印:

retrieved t2 object table2{Id=1, name='my table2 object', t1=table1{Id=1, name='my table1 object'}}

这是相应的 MySQL 的样子:

MariaDB [so41334487]> show tables;
+----------------------+
| Tables_in_so41334487 |
+----------------------+
| table1 |
| table2 |
+----------------------+
2 rows in set (0.00 sec)

MariaDB [so41334487]> describe table1;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.06 sec)

MariaDB [so41334487]> describe table2;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| t1_id | int(11) | YES | MUL | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

MariaDB [so41334487]> select * from table1;
+----+------------------+
| id | name |
+----+------------------+
| 1 | my table1 object |
+----+------------------+
1 row in set (0.00 sec)

MariaDB [so41334487]> select * from table2;
+----+------------------+-------+
| id | name | t1_id |
+----+------------------+-------+
| 1 | my table2 object | 1 |
+----+------------------+-------+
1 row in set (0.00 sec)

这是从 SHOW CREATE TABLE table2 中提取的相应 CREATE 语句:

CREATE TABLE `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`t1_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK30i46miycdu2aqony71wj8kva` (`t1_id`),
CONSTRAINT `FK30i46miycdu2aqony71wj8kva` FOREIGN KEY (`t1_id`) REFERENCES `table1` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1

那里有很多高质量的内容,包括关于 @OneToOne 的书籍和视频讲座以及相应的陷阱,但是如果您正在寻找快速提示,您可以开始 in the WikiBook on JavaPersistence 。另请记住,如果您在(一系列)对象之间创建循环引用,则链接 FetchType.EAGER 可能会导致您将整个数据库加载到内存中。

关于java - 在 hibernate 中仅将属性设置为外键 int 就足够了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41334487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com