gpt4 book ai didi

java - Ebean:如何为没有属性的 getter 创建列

转载 作者:行者123 更新时间:2023-12-01 21:43:21 25 4
gpt4 key购买 nike

我不希望能够将 Java 计算出的值存储在我的数据库中。

例如,我可能有一个带有 firstNamelastName 的 Person 类。我可能需要一个 getter 来返回 Person 名字的总长度,而不是一个实际的属性。

@Entity
public class Person extends Model {
@Id
public Long id;

public String firstName;

public String lastName;

public Int getNameLength() {
return firstName.length() + lastName.length();
}

public Person (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}

因此,如果我像这样创建一个新的Person:

Person bob = new Person("Bob", "Roy");
bob.save();

然后我们应该在表中得到这个:

|  id  |  first_name  |  last_name  |  name_length |
====================================================
| 1 | "Bob" | "Roy" | 6 |

有人知道这是否可行吗?

最佳答案

拜托了Old Gods and the New Gods不要这样做

这样做会完全搞乱你的数据库。您迟早会遇到问题。查看您的个人资料,您获得了计算机科学学位,因此您肯定已经完成了数据库类(class)。记住Second normal formThird normal form以及如果您的属性依赖于其他属性,您将如何打破这个问题。

您应该做的是拥有一个 transient 字段(用 @Transient 标记),或者您可以使用 getter 并从那里提供信息。每次您需要访问 name_length 时,您都会调用此 getter,但不会将信息存储在数据库中。

即使您想在应用程序之外计算长度,您仍然可以使用一些数据库函数来实现 - like length .

<小时/>

根据OP提到的要求进行编辑:

在 JPA 中,有两种方法可以声明列 - 在字段上或在方法(getter/setter)上。它会像这样:

@Column(name = "complex_calculation") // Due to some bad requirement
public Integer getNameLength() {
return fisrtName.length() + lastName.length();
}

但是您在问题中提到了 Ebean,并且 Ebean 不被视为引用 JPA 实现。很有可能尚未支持此功能,但您可以在具体情况下尝试。

还有另一种方法被证明是有效的。您可以这样定义模型:

@Entity
public class Person extends Model {
@Id
private Long id;

private String firstName;

private String lastName;

private Integer nameLength;

public Long getId() {
return id;
}

// getter for first name and last name with @Column annotation

@Column(name = "complex_calculation")
public Integer getNameLength() {
return firstName.length() + lastName.length();
}

public Person (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
updateComplexCalculation();
}

public void setFirstName(String firstName) {
this.firstName = firstName;
updateComplexCalculation();
}

public void setLastName(String lastName) {
this.lastName = lastName;
updateComplexCalculation();
}

private void updateComplexCalculation() {
this.nameLength = firstName.length() + lastName.length();
}
}

重要的部分是updateComplexCalculation方法。当构造函数被调用时以及每次 setter 调用时,您都会调用此方法来更新complex属性。当然,您应该仅在计算所需的 setter 调用上调用它。

以下代码:

Person p = new Person("foo", "bar");
p.save();

Logger.debug("Complex calculation: " + p.getNameLength());

p.setFirstName("somethingElse");
p.save();

Logger.debug("Complex calculation: " + p.getNameLength());

产量:

[debug] application - Complex calculation: 6
[debug] application - Complex calculation: 16

关于java - Ebean:如何为没有属性的 getter 创建列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36208743/

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