【发布时间】:2020-07-19 20:02:48
【问题描述】:
嗨,我正在使用 OneToMany 和 ManyToOne 双向关系学习 Spring JPA,在某些示例中,当我在两侧编写时,我看到 OneToMany 和 ManyToOne 关系,JPA 添加一个新列作为外键列并从父表。但是当我尝试我的时,该列始终为空白。这是我的代码的样子:
这是我的 Account.java 模型:
@Entity
@Table(name = "msAccount")
public class Account {
@Id
@NotBlank(message = "Not Blank")
@Size(min = 0, max = 20)
public String accountId;
@NotBlank(message = "Not Blank")
public String accountName;
@NotBlank(message = "Not Blank")
@Email(message = "Should be the right email")
public String accountEmail;
@NotBlank(message = "Not Blank")
@Size(min = 5, message = "Minimal 5 char")
public String accountAddress;
@NotBlank(message = "Not Blank")
public String town;
@NotBlank(message = "Not Blank")
public String npwp;
@NotBlank(message = "Not Blank")
public String phoneNumber;
public String fax;
public String remarks;
@NotNull
public Date entryTime;
@NotNull
public Boolean active;
@OneToMany(mappedBy="account", cascade = CascadeType.ALL, orphanRemoval = true)
public List<Dealer> dealer;
//getter setter skipped
}
这是我的 Dealer.java 模型:
@Entity
@Table(name = "msDealer")
public class Dealer {
@Id
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 0, max = 20)
public String dealerId;
@NotBlank(message = "Tidak Boleh Kosong")
public String dealerName;
@NotBlank(message = "Tidak Boleh Kosong")
@Email(message = "Masukkan Email yang bener")
public String dealerEmail;
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 5, message = "Minimal 5 karakter")
public String dealerAddress;
@ManyToOne(fetch = FetchType.LAZY)
public Account account;
//getter setter skipped
}
这是我的存储库:
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
}
这是我的服务:
@Service
public class AccountService {
@Autowired
private AccountRepository accountRepository;
public Account save(Account account) {
return accountRepository.save(account);
}
}
这是我的控制器:
@RestController
@RequestMapping("/api/account")
public class AccountController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final int ROW_PER_PAGE = 10;
@Autowired
private AccountService accountService;
@PostMapping("/new")
public ResponseEntity<Account> addAccount(@Valid @RequestBody Account account) {
try {
Account newAccount = accountService.save(account);
return ResponseEntity.created(new URI("/api/account/" + newAccount.getAccountId()))
.body(account);
} catch(Exception ex) {
logger.error(ex.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
}
}
然后我将 JSON 发布到我的保存端点:
{
"accountId": "USA001",
"accountName": "string",
"accountEmail": "string",
"accountAddress": "string",
"town": "string",
"npwp": "string",
"phoneNumber": "string",
"fax": "string",
"remarks": "string",
"entryTime": "2020-04-07T15:01:29.404Z",
"active": true,
"dealer": [
{
"dealerId": "MMO001",
"dealerName": "string",
"dealerEmail": "string",
"dealerAddress": "string"
}
]
}
当我保存它时,显示在我的终端中的休眠看起来将查询插入到那 2 个表中,但是当我检查我的数据库表(即 postgresql)时,我发现有一个字段“account_account_id”为空,什么我想念这里吗?
我希望 Hibernate 像这样运行 sql:
insert into account (account_id, account_name, ...etc)
values ('USA001', 1)
insert into dealer (account_account_id, dealer_name, dealer_id, ...etc)
values ('USA001', 'New dealer 1', 'MMO001')
经过一番尝试,这是我的更新模型:
我的帐户.java 我删除 cascade = CascadeType.ALL, orphanRemoval = true
@Entity
@Table(name = "msAccount")
public class Account {
@Id
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 0, max = 20)
public String accountId;
@NotBlank(message = "Tidak Boleh Kosong")
public String accountName;
@NotBlank(message = "Tidak Boleh Kosong")
@Email(message = "Masukkan Email yang bener")
public String accountEmail;
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 5, message = "Minimal 5 karakter")
public String accountAddress;
@NotBlank(message = "Tidak Boleh Kosong")
public String town;
@NotBlank(message = "Tidak Boleh Kosong")
public String npwp;
@NotBlank(message = "Tidak Boleh Kosong")
public String phoneNumber;
public String fax;
public String remarks;
@NotNull
public Date entryTime;
@NotNull
public Boolean active;
@OneToMany(mappedBy="account")
// @JoinColumn(name = "accountId")
public List<Dealer> dealer;
//getter setter skipped
}
这是我的 Dealer.java。添加了@JoinColumn:
@Entity
@Table(name = "msDealer")
public class Dealer {
@Id
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 0, max = 20)
public String dealerId;
@NotBlank(message = "Tidak Boleh Kosong")
public String dealerName;
@NotBlank(message = "Tidak Boleh Kosong")
@Email(message = "Masukkan Email yang bener")
public String dealerEmail;
@NotBlank(message = "Tidak Boleh Kosong")
@Size(min = 5, message = "Minimal 5 karakter")
public String dealerAddress;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account_id")
public Account account;
//getter setter skipped
}
现在错误越来越奇怪了,我在保存 JSON 数据时遇到了这个错误
> "Unable to find com.api.b2b.Model.Dealer with id MMO001; nested
> exception is javax.persistence.EntityNotFoundException: Unable to find
> com.api.b2b.Model.Dealer with id MMO001"
在某些教程中它有效,但我的不是,我做错了什么?
这是我的 github 仓库:https://github.com/Fly-Away/LearningSpring
【问题讨论】:
-
JFYI:如果您修改 ORM,您应该重新创建数据库(以正确更新)或者如果无法手动更新它。否则,您将在数据库中看到已弃用的表/列。
-
是的,我每次重新加载项目时都使用 spring.jpa.hibernate.ddl-auto=create 重新创建表
标签: java sql spring hibernate hibernate-mapping