Java 控制什么';s在春季连载+;冬眠
我想,我在准确理解Java 控制什么';s在春季连载+;冬眠,java,spring,hibernate,Java,Spring,Hibernate,我想,我在准确理解@Autowire的工作原理方面遇到了一些问题。我当前的问题是数据模型中基于对象的关系: 假设存在多对一关系,在模型中以两种方式定义,如下所示: @Entity @Table(name = "Company") public class Company { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "Id", nullable = false) p
@Autowire
的工作原理方面遇到了一些问题。我当前的问题是数据模型中基于对象的关系:
假设存在多对一关系,在模型中以两种方式定义,如下所示:
@Entity
@Table(name = "Company")
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id", nullable = false)
private Integer id;
@Column(name = "Code", nullable = false)
private String code;
@Column(name = "Name", nullable = false)
private String name;
...
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "CountryCodeA3")
private Country country;
...
@Entity
@Table(name = "Country")
public class Country {
@Column(name = "CodeA2", nullable = false)
private String codeA2;
@Id
@Column(name = "CodeA3", nullable = false)
private String codeA3;
@Column(name = "CodeNum", nullable = false)
private String codeNum;
@Column(name = "Name", nullable = false)
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "country")
private Set<Company> companies;
...
这也不是我想要的
我想要的是使用Java中的对象,并仅为Company.countryCodeA3
序列化像FK字段值这样的简单内容。我也不需要将整个反向关系数组交给客户机,除非我明确地告诉它(通过一个单独的函数)。我不知道如何创建一个公司并指定该公司所在的国家(而不实际将整个国家对象添加到发布的公司)
我知道如何编写函数来实际检索关系。我不知道(这就是问题所在)如何告诉他们在序列化一个特定对象时不要深入。我只想发送国家id来告诉这家公司属于哪个国家——如果是多对多的关系,一份id列表
那么,我可以告诉Spring+Hibernate只序列化简单对象,只通过单独的函数提供对象关系吗?存在很多方法,其中之一就是使用
@JSON
注释。使用此注释,您可以控制哪些字段应该序列化/反序列化
JSON注释可用于将对象中的字段标记为默认包含的字段。可以在方法或字段上放置注释。一个很好的例子可能是包含对Zipcode对象的引用的Address对象。由于Zipcode是每个地址(在美国)不可分割的一部分,因此我们可以将其默认为注释。因此,在Address对象中,我们可以执行以下操作:
public class Address {
private String name;
private String street;
private String city;
private String state;
private Zipcode zipcode;
@JSON
public Zipcode getZipcode() { }
}
注释可以提高您的安全性,这样就可以在一个地方修复不应该通过网络发送的字段。这样,您可以更多地保留代码,并防止意外的安全缺陷。考虑在用户对象中存储密码的哈希版本。
public class User {
private String login;
private String hashedPassword;
private Date lastLogin;
@JSON(include=false)
public String getHashedPassword() { }
}
嗯,这个注释会很棒,但我的IntelliJ发现不是。我也尝试了快速谷歌,但没有成功。这是春天里的东西吗?谢谢你的提示。找到了@JsonIgnore注释。它和你的样品做的一样。但仍然不是一个完整的解决方案:我想要的似乎是一个自定义序列化程序。现在我必须声明同一个字段两次,以便将其序列化为代码并在Java后端作为对象工作。我似乎越来越善于在每分钟内找到这些东西:)如果你使用Spring,你可能会更好地查找Jackson库?阿菲克·斯普林负责他们。是的,我用的是杰克逊,但我现在真的找不到这玩意儿了。。。也许只是我的链接错了,但杰克逊有同样的注释。这正是我被赋予的工作,因为我的客户现在对人力资源非常紧张。
public class Address {
private String name;
private String street;
private String city;
private String state;
private Zipcode zipcode;
@JSON
public Zipcode getZipcode() { }
}
public class User {
private String login;
private String hashedPassword;
private Date lastLogin;
@JSON(include=false)
public String getHashedPassword() { }
}