当两个对象相同时

发布于 2025-02-04 18:04:21 字数 1832 浏览 3 评论 0原文

我有下面的课。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Entity
@Table( name = "hires", indexes = { @Index( name = "idx_hire_date", columnList = "date DESC" ) }, uniqueConstraints = {
    @UniqueConstraint( columnNames = { "vehicle_id", "po_number" } ) } )
@DynamicUpdate
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id" )
public class Hire implements Serializable {

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
int id;

@OneToOne( targetEntity = Driver.class, fetch = FetchType.EAGER )
@JoinColumn( name = "pass_payer", referencedColumnName = "id", nullable = true )
Driver passPayer;

@OneToOne( targetEntity = Driver.class, fetch = FetchType.EAGER )
@JoinColumn( name = "driver_id", referencedColumnName = "id", nullable = true )
Driver driver;
...
}

我通过休息端点获得此对象。 问题是当字段 passpayer 驱动程序对象相等,在返回的json中,驱动程序字段仅包含ID(这只是整数值)和 passpayer 字段具有所有对象字段。

"passCost": 300.0,
        "passPayer": {
            "id": 9,
            "firstName": "XXXX",
            "lastName": "XXXXXX",
            "idNo": "000000000000"
        },
        "driver": 9,
        "driverSalary": xxxx.xx, 

当这些字段具有不同的对象时,两个字段都显示如下所示。

"passCost": 300.0,
        "passPayer": {
            "id": 9,
            "firstName": "XXXX",
            "lastName": "XXXXXX",
            "idNo": "000000000000"
        },
        "driver": {
            "id": 4,
            "firstName": "YYYYYY",
            "lastName": "YYYYYYY",
            "idNo": "10101010101"
        },
        "driverSalary": 00000.00,

我都需要两个对象都包含数据(fielts。[id,firstName,lastName,idno]),无论它们是否相等。

任何线索都受到赞赏!

I have a class like below.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Entity
@Table( name = "hires", indexes = { @Index( name = "idx_hire_date", columnList = "date DESC" ) }, uniqueConstraints = {
    @UniqueConstraint( columnNames = { "vehicle_id", "po_number" } ) } )
@DynamicUpdate
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id" )
public class Hire implements Serializable {

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
int id;

@OneToOne( targetEntity = Driver.class, fetch = FetchType.EAGER )
@JoinColumn( name = "pass_payer", referencedColumnName = "id", nullable = true )
Driver passPayer;

@OneToOne( targetEntity = Driver.class, fetch = FetchType.EAGER )
@JoinColumn( name = "driver_id", referencedColumnName = "id", nullable = true )
Driver driver;
...
}

I get this object via a Rest endpoint.
The problem is when the field passPayer and driver objects are equal, in the returning JSON, the driver field contains only the ID (which is just an integer value) and passPayer field has all the object fields.

"passCost": 300.0,
        "passPayer": {
            "id": 9,
            "firstName": "XXXX",
            "lastName": "XXXXXX",
            "idNo": "000000000000"
        },
        "driver": 9,
        "driverSalary": xxxx.xx, 

When these fields have different objects, both fields show full details like below.

"passCost": 300.0,
        "passPayer": {
            "id": 9,
            "firstName": "XXXX",
            "lastName": "XXXXXX",
            "idNo": "000000000000"
        },
        "driver": {
            "id": 4,
            "firstName": "YYYYYY",
            "lastName": "YYYYYYY",
            "idNo": "10101010101"
        },
        "driverSalary": 00000.00,

I need both objects to contain data (fields. [id, firstName, lastName, idNo]) whether they are equal or not.

Any clue is appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

带刺的爱情 2025-02-11 18:04:21

这是由@jsonidentityInfo(Generator = ObjectidGenerators.PropertyGenerator.Class,property =“ ID”)引起的,检查 docs 。引用:

用于指示注释类型的值或
属性应序列化,以便实例包含
附加对象标识符(此外,实际对象属性),
或作为由对象ID组成的参考
序列化。

由于两个字段都引用了相同的对象,因此第二个字段被序列化为对第一个对象的引用。

以我的经验,此注释主要用于处理循环引用,因此您可以:

  1. 删除,如果您的用例允许(对象中没有圆形引用)
  2. 或您可以使用DTO(无论如何是首选的方法)

This is caused by @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "id" ), check the docs. To cite :

Annotation used for indicating that values of annotated type or
property should be serializing so that instances either contain
additional object identifier (in addition actual object properties),
or as a reference that consists of an object id that refers to a full
serialization.

Since both fields are referencing the same object, the second one is serialized as a reference to the first object.

In my experience, this annotation is mostly used to deal with circular references, so you can:

  1. remove it, if your use case allows it(no circular references in object)
  2. or you can use DTOs(which is the prefered approach anyway)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文