我使用Hibernate来控制我的数据库,我有2个表:
CREATE TABLE IF NOT EXISTS `User`(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL DEFAULT '',
`account` VARCHAR(255) NOT NULL DEFAULT '',
`password` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
)
CREATE TABLE IF NOT EXISTS `Project` (
`id` INT NOT NULL AUTO_INCREMENT,
`manager` INT NOT NULL,
`name` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
FOREIGN KEY (`manager`) REFERENCES `User`(`id`)
)
我完成了映射:
用户:
// ... import code
@Entity
@Table
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column
private String name, account, password;
@OneToMany(mappedBy = "manager")
private List<Project> projects;
public User() {
}
// ... Getter & Setter code
}
项目:
// ... import code
@Entity
@Table
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column
private String name;
@ManyToOne
@JoinColumn(name = "manager")
private User manager;
public Project () {
}
// ... Getter & Setter code
}
我想知道在选择项目时是否可行,项目将包含其经理数据但没有密码。
在其他方面,我希望我得到的每个项目都是这样的(格式为JSON):
{
"id": 0,
"name": "A test project",
"manager": {
"id": 0,
"name": "John Smith"
"accound": "user1",
"password": null
}
}
答案 0 :(得分:1)
可以使用projection来限制您想要带入内存的字段,您可以获得除password
之外的所有字段的投影。
另一个选项可以是在字段中添加延迟注释:
@Basic(fetch = FetchType.LAZY)
@Column(...)
private String password;
另一种方法是使用直接HQL查询并仅加载this answer所需的字段。
答案 1 :(得分:0)
如果您根本不想映射此字段,可以使用@Transient
注释:
@Transient
private String password;
如果您只是在将对象转换为特定JSON表示时根本不想显示此字段,那么这是一个数据表示问题,而不是ORM映射问题。将对象转换为JSON时,应跳过此字段。实现取决于您使用的JSON转换器。例如,如果您使用Jackson,那么@JsonIgnore
注释就是您所需要的。