Conta contrapartida no plano de contas?

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?

  • Ou existe algum padrão para resolver isso?

  • Alguém tem alguma sugestão?

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

cara, uma dica pra n ter erro:

Crie suas tabelas da seguinte forma:

uma tabela de contas, e uma tabela de relacionamento entre contas, onde vc informa os ids da conta em colunas, id_conta_deb e id_conta_cred …

depois faz um mapeamento automático desta tabela pelo netbeans ou pelo eclipse.

Claro que você pode fazer manualmente, e neste caso seria one to many, mas as vezes estes atalhos de IDEs ajudam a tirar as dúvidas que surgem.

1 curtida

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?

Não entendi essa parte…mas é isso que eu quero fazer

Bom, aqui vai um simples tutorial passo-a-passo no NetBeans 7:

1 - Crie um novo projeto Java no NetBeans.

2 - Crie nela um pacote onde deseja armazenar suas entidades.

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)

7 - Escolha a conexão que você criou, e selecione as tabelas as quais quer criar entidades mapeadas.

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.

9 - Finalize, e Voilá. o NetBeans cria pra vc os relacionamentos, classes e etc.
Agora é so correr pro abraço

Ta na mão um mini tutorial que te ajudará nesta tarefa de mapear. uso SEMPRE.

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?

Procura por relacionamento unidirecional x bidirecional.

acho que ele n criou a estrutura dele assim.
acho que ele quer fazer algo assim:

@Entity
public class ContaContrapartida{
  @Id
  private Long id; 
  @OneToOne
  private PlanoContas contaCredito;
  @OneToOne
  private PlanoContas contaDebito;
}
1 curtida

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

Obrigado, más creio que isso não me ajudará pois não possuo o esquema do banco de dados, eu utilizo Hibernate e deixo que ele cria pra mim

Pelo que entendi.

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

tenta trocar o

 @Column(name = "conta_contrapartida_conta")

para

 @JoinColumn(name = "conta_contrapartida_conta")

segundo este link isto pode ajudar.

Obrigado Icaro, funcionou, porém tive que mudar nos dois

2 curtidas

Sim, era pra mudar nos dois mesmo, eu que deveria ter explicado melhor e não fui claro. bom que deu certo!

1 curtida