Estou fazendo um cadastro de plano de contas contábil onde uso a seguinte estrutura:
public class PlanoContas implements Serializable
{
private static final long serialVersionUID = 1L;
private long id;
private long pai;
private String conta;
private String descricao;
private ContaType tipoConta;
private DebitoCreditoType debitoCredito;
Até ai tudo bem, o que eu quero fazer é que depois que o usuário cadastrar o plano de contas ele posso vincular uma conta na outra, ou seja, para cada conta de debito existe uma de credito que já deve estar cadastrado.
Para isso pensei em uma tabela onde já estaria preenchido em uma coluna as contas cadastrada e na outra ele escolheria a contrapartida
public class ContaContrapartida implements Serializable
{
private static final long serialVersionUID = 1L;
private PlanoContas debito;
private PlanoContas credito;
Estou usando Hibernate, e não sei que tipo de relacionamento devo usar, já sei que dessa forma não funciona, talvez uma tabela de ManyToMany, onde o primeiro item da lista seria debito e o segundo credito?
Cada conta de crédito está atrelada a apenas uma e somente uma conta de débito?
Se a resposta é sim, com certeza um @OneToOne (daí você decide se uni ou bidirecional)
Se a resposta é não, pergunte-se cada conta de débito está atrelada a mais de uma conta de crédito e cada conta de crédito está atrelada a apenas uma conta de débito?
Se sim, @OneToMany de débito para crédito (novamente, decida se uni ou bidirecional).
Se não, mas o inverso (cada conta de crédito está atrelado a mais de uma conta de débito e cada conta de débito a apenas uma conta de crédito) @OneToMany de crédito para débito.
Se não, @ManyToMany…
Então Luiz, cada conta de debito tem apenas uma de credito…
Más a questão é, eu terei que memcionar duas vezes na mesma tabela, a uma única coluna da tabela conta. O hibernate não permite fazer isso (ate onde eu sei)
não teria um padrão do Design Patterns?
3 - Depois de criado o pacote, você clica na aba “serviços” e cria uma conexão com seu banco de dados.
nova conexão
4 - Escolha o driver do seu banco de dados, e forneça os dados da conexão
5 - Finalize a criação da conexão, e volte para a aba Projetos.
6 - Com o botão direito em cima do seu pacote, clique em "Novo > Classe de entidade do banco de dados (caso n esteja aqui, procure em outros, no fim do menu)
8 - selecione as opções como classes de lista que deseja usar para relacionamentos ManyToOne, se quer gerar anotações e namedQuerys etc… isso fica a seu gosto.
Como assim, terá que mencionar duas vezes na mesma tabela?
Até onde sei @Entity public class ContaDebito{ @Id private Long id; @OneToOne private ContaCredito contaCredito; }
e @Entity public class ContaCredito{ @Id private Long id; @OneTOOne //Opcional private ContaDebito contaDebito; }
Qual seria a razão para uma segunda menção?
Isso mesmo Icaro
Ou alguém me sugere uma estrutura diferente…
Por que o resultado que eu quero é o seguinte
O usuário cadastra o plano de contas
Depois em uma tabela aparecerá todas as contas cadastradas na primeira coluna e nas colunas seguintes ele selecionará os parâmetros de cada conta, onde uma delas é selecionar uma conta de crédito/débito para contrapartida.
Isso seria aplicado quando por exemplo o usuário der baixa de uma conta a receber e ele selecionar a conta ENTRADA DE CAIXA automaticamente ele também deve movimentar CONTAS A RECEBER
1 Usuario pode ter vários “PlanoConta”. E cada PlanoConta tem um tipo de conta?
Não seria, OneToMany (Usuario->PlanoConta) Um usuário pode ter vários PlanoConta ai já ficam associadas as contas (pelo usuário) (você falou em UMA conta de débito e UMA de credito)
Quando você da select no usuário já puxa a list de PlanoConta que ele tem que e estes vem com as contas de débito e crédito.
Na sua entity de usuario teria umList<PlanoConta> para fazer o OneToMany e no PlanoConta ManyToOne de atributo Usuario.
Me desculpem se não estou me empresando bem, mas quando falo de usuário me refiro a quem usa o sistema.
deixa eu retomar…
public class PlanoContas implements Serializable {
private static final long serialVersionUID = 1L;
private long id;
private long pai;
private String conta;
private String descricao;
private ContaType tipoConta;
private DebitoCreditoType debitoCredito;
Assim é meu cadastro de contas. Onde cada conta ja é cadastrado como debito ou crédito.
O que eu preciso:
Uma tabela onde para cada conta de debito cadastrado possa ser possível associar a uma conta de crédito (ja cadastrado no plano de contas) e vice_versa.
Algo assim, mas como fazer isso em hibernate
@Entity
@Table(name = "conta_contrapartida")
public class ContaContrapartida implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "conta_contrapartida_id")
private long id;
@OneToOne
@Column(name = "conta_contrapartida_conta")
private PlanoContas conta;
@OneToOne
@Column(name = "conta_contrapartida_contrapartida")
Porem dessa forma o hibernate não aceita. O erro é o seguinte
private PlanoContas contaContrapartida;
Caused by: org.hibernate.AnnotationException: @Column(s) not allowed on a @OneToOne property: br.com.rene.model.pojo.ContaContrapartida.conta